package pacs.sgc.negocio;

import java.util.List;

import pacs.sgc.classesbasicas.Endereco;
import pacs.sgc.dao.EnderecoDao;
import pacs.sgc.dao.FabricaDao;
import pacs.sgc.exceptions.AcessoAoBancoException;
import pacs.sgc.exceptions.ClienteJaCadastradoException;
import pacs.sgc.exceptions.ClienteNaoEncontradoException;
import pacs.sgc.exceptions.ConexaoComBancoException;
import pacs.sgc.exceptions.EnderecoJaCadastradoException;
import pacs.sgc.exceptions.EnderecoNaoEncontradoException;
import pacs.sgc.exceptions.NenhumClienteCadastradoException;
import pacs.sgc.exceptions.NenhumEnderecoCadastradoException;

public class CadastroEndereco implements ICadastroEndereco {
	
	EnderecoDao enderecoDao;

	public CadastroEndereco(){
		this.enderecoDao = FabricaDao.criarEnderecoDao();
	}
	
	public void atualizar(Endereco atualizado) throws AcessoAoBancoException,
			ConexaoComBancoException, EnderecoNaoEncontradoException {
		if(this.enderecoDao.localizar(atualizado.getCodigo()) != null){
			this.enderecoDao.atualizar(atualizado);
		}else{
			EnderecoNaoEncontradoException e =
				new EnderecoNaoEncontradoException();
			throw e;
		}
	}

	public int gerarCodigo() throws AcessoAoBancoException,
			ConexaoComBancoException {		
		return this.enderecoDao.gerarCodigo();
	}

	public void inserir(Endereco novoEndereco) throws AcessoAoBancoException,
			ConexaoComBancoException, EnderecoJaCadastradoException {
		if(this.enderecoDao.localizar(novoEndereco.getCodigo()) == null){
			this.enderecoDao.inserir(novoEndereco);
		}else{
			EnderecoJaCadastradoException e =
				new EnderecoJaCadastradoException();
			throw e;
		}				
	}

	public List<Endereco> listar() throws AcessoAoBancoException,
			ConexaoComBancoException, NenhumEnderecoCadastradoException {
		if(this.enderecoDao.listar().size() > 0){
			return this.enderecoDao.listar();
		}else{
			NenhumEnderecoCadastradoException e =
				new NenhumEnderecoCadastradoException();
			throw e;
		}
	}

	public Endereco localizar(int codigo) throws ConexaoComBancoException,
			AcessoAoBancoException {
		// TODO Auto-generated method stub
		return this.enderecoDao.localizar(codigo);
	}

	public void remover(int codigo) throws ConexaoComBancoException,
			AcessoAoBancoException, EnderecoNaoEncontradoException {
		if(this.enderecoDao.localizar(codigo) != null){
			this.enderecoDao.remover(codigo);
		}else{
			EnderecoNaoEncontradoException e =
				new EnderecoNaoEncontradoException();
			throw e;
		}
	}

}
